<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>对象的内存结构</title>
    <script>
        /* 
            对象（Object）

            对象的内存结构
                对象存储属性的位置区域有两个
                    1.对象自身
                        比如通过对象添加的属性，位于对象自身中
                        在类中通过x=y的形式添加的属性，位于对象自身中。

                    2.原型对象（prototype）

                        对象中还有一些内容(比如下面的sayHello()方法)，会存储在其它的对象里，这个其它称为原型对象。

                        在每个对象中总会有一个属性用来存储原型对象，这个对象为  __proto__

                        原型对象也负责为对象存储属性，当我们访问对象中的属性时，它会优先访问自身的属性，当对象自身不包含该属性时，才会去原型对象中寻找。

                        会添加到原型对象中的情况
                            1.在类中，通过xxx（）{}所添加的方法会位于原型对象中。
                            2.主动向原型中添加的属性或方法。

        */
        class Person {
            constructor(a,b) {
                this.name = a;
                this.age= b;
            }
            //  这种定义方式在p1中看不到
            sayHello() {
                console.log(`hello,我是`, this.name)
            }


            sayHello1=()=>{
                console.log('我是箭头函数定义的方法',this.name)
            }
            sayHello2=function(){
                console.log('我是通过函数定义创建的方法',this.name)
            }
        }

        const p1= new  Person('朱丽叶',2)


        console.log(p1)
        console.log(p1.__proto__)
        p1.sayHello()
    </script>
</head>

<body>

</body>

</html>